<?php 
class plugins_actionModel extends Model{
    public $tabela = "plugins_action";
    public $pkey   = 'plugins_action_cod';
    public $dados  = array(
        'plugins_action_cod' => array(
	    'name'     => 'Código',
	    'type'     => 'int',
	    'size'     => '11',
	    'pkey'    => true,
	    'ai'      => true,
	    'grid'    => true,
	    'display' => true,
	    'private' => true
        ),
        'plugins_model_cod' => array(
	    'name'     => 'Modelo',
	    'type'     => 'int',
	    'size'     => '11',
	    'grid'    => true,
	    'display' => true,
            'notnull' => true,
	    'fkey' => array(
	        'model' => 'plugins/model',
	        'cardinalidade' => '1n',
	        'keys' => array('plugins_model_cod', 'plugins_model_label'),
	    ),
        ),
         'plugins_action_nome' => array(
	    'name'     => 'Nome',
	    'type'     => 'varchar',
	    'size'     => '64',
            'unique'   => array('model' => 'plugins/action'),
	    'index'   => true,
	    'grid'    => true,
	    'display' => true,
        ),
         'plugins_action_label' => array(
	    'name'     => 'Label',
	    'type'     => 'varchar',
	    'size'     => '32',
	    'grid'    => true,
	    'display' => true,
        ),
        'plugins_permissao_cod' => array(
	    'name'     => 'Permissão',
	    'type'     => 'int',
	    'size'     => '11',
	    'grid'    => true,
	    'display' => true,
	    'fkey' => array(
	        'model' => 'plugins/permissao',
	        'cardinalidade' => '1n',
	        'keys' => array('plugins_permissao_cod', 'plugins_permissao_label'),
	    ),
        ),
         'plugins_action_groupyes' => array(
	    'name'     => 'Padrão Sim',
	    'type'     => 'enum',
	    'default' => 's',
	    'options' => array(
	    	's' => 's',
	    	'n' => 'n',
	    	'p' => 'p',
	    ),
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
            'description' => "Usuários que possuem a permissão especificada terão que tipo de acesso ao plugin?"
        ),
         'plugins_action_groupno' => array(
	    'name'     => 'Padrão Não',
	    'type'     => 'enum',
	    'default' => 's',
	    'options' => array(
	    	's' => 's',
	    	'n' => 'n',
	    	'p' => 'p',
	    ),
	    'grid'    => true,
	    'display' => true,
            'description' => "Usuários que não possuem a permissão especificada terão que tipo de acesso ao plugin?"
        ),
         'plugins_action_privacidade' => array(
	    'name'     => 'Privacidade',
	    'type'     => 'enum',
	    'default' => 'publico',
	    'options' => array(
	    	'publico' => 'publico',
	    	'privado' => 'privado',
	    ),
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
        
        'plugins_action_sendnotify' => array(
	    'name'     => 'Envia Notificação',
	    'type'     => 'enum',
	    'default' => 'n',
	    'options' => array(
	    	's' => 'Sim',
	    	'n' => 'Não',
	    ),
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
            'description' => "Marque sim caso este plugin envie alguma notificação para um usuário.
                Esta opção será utilizada no plugin de notificação para que o usuário escolha como 
                prefere ser notificado.",
        ),
        'button' => array(
            'button' => 'Salvar Ação'
        )
    );
    
    public function isPublic($action){
        if(!is_array($action)) return true;
        if(empty($action)) return true;
        if(!array_key_exists("plugins_action_privacidade", $action)) return true;
        return ($action['plugins_action_privacidade'] == 'publico');
    }
    
    public function geraMenu($plugin, $action_name){
        
        $obj = $this->LoadActionObject($plugin);
        if($obj == NULL) return;
        
        $menu = $this->getPermitedMenu($obj, $action_name);
        if(empty($menu)) return;

        $prepared = $this->prepareMenu($menu);
        if(empty($prepared)) return;
        
        EventTube::addMenu('body-top', $prepared, 'menu/multiple');
    }
    
    private function LoadActionObject($plugin){
        $class = "{$plugin}Actions";
        $file = MODULOS ."$plugin/Config/$class.php";
        if(!file_exists($file))return NULL;
        require_once $file;
        if(!class_exists($class)) return NULL;
        $obj = new $class();
        return $obj;
    }
    
    
     private function getPermitedMenu($obj, $action_name){
         //será utilizado na função mountPermMenu
        $this->LoadModel("usuario/perfil", 'perf'); 
        $menu = ($obj->getMenu($action_name));
        $out  = array();
        $this->mountPermMenu($menu, $out);
        return $out;
    }
    
    private function mountPermMenu($menu, &$out){
        foreach($menu as $name => $link){
            if(!is_array($link)){
                if(!$this->perf->hasPermission($link)) continue;
                $out[$name] = $link;
            }else $this->mountPermMenu ($link, $out[$name]);
        }
    }
    
    private function prepareMenu($menu){
        $out  = array();
        $actions = array();
        $this->getMenuActions($menu, $actions);
        $string = "'".implode("','", $actions) . "'";
        $menu2 = $this->selecionar(array('plugins_action_nome','plugins_action_label'), "plugins_action_nome IN($string)");
        foreach($menu2 as $m){
            $out[$m['plugins_action_nome']] = $m['plugins_action_label'];
        }
        
        $actions = array();
        $this->mountActions($menu, $out, $actions);
        return $actions;
    }
    
    private function getMenuActions($menu, &$actions){
        foreach($menu as $m){            
            if(is_array($m)) $this->getMenuActions ($m, $actions);
            else $actions[] = $m;
        }
    }
    
    private function mountActions($menu, $menu2, &$actions){
        foreach($menu as $cod => $m){
            if(is_array($m)){
                $actions[$cod] = array();
                $this->mountActions($m, $menu2, $actions[$cod]);
            }
            else {
                if(!is_numeric($cod)) $actions[$cod] = $m;
                elseif(isset($menu2[$m])) $actions[$menu2[$m]]  = $m;
                else $actions[$m]  = $m;
            }
        }
    }
}
?>